5a0d9da75eca6c15b6e367782c9106f610837ad8,oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentWriter.java,SegmentWriter,flush,#,179
Before Change
buffer[pos++] = (byte) (offset >> Segment.RECORD_ALIGN_BITS);
}
SegmentId id = segment.getSegmentId();
log.debug("Writing data segment {} ({} bytes)", id, length);
store.writeSegment(id, buffer, buffer.length - length, length);
After Change
int segmentOffset = 0;
int segmentLength = 0;
synchronized (this) {
if (length > 0) {
int refcount = segment.getRefCount();
int rootcount = roots.size();
buffer[Segment.ROOT_COUNT_OFFSET] = (byte) (rootcount >> 8);
buffer[Segment.ROOT_COUNT_OFFSET + 1] = (byte) rootcount;
int blobrefcount = blobrefs.size();
buffer[Segment.BLOBREF_COUNT_OFFSET] = (byte) (blobrefcount >> 8);
buffer[Segment.BLOBREF_COUNT_OFFSET + 1] = (byte) blobrefcount;
length = align(
refcount * 16 + rootcount * 3 + blobrefcount * 2 + length,
16);
checkState(length <= buffer.length);
int pos = refcount * 16;
if (pos + length <= buffer.length) {
// the whole segment fits to the space *after* the referenced
// segment identifiers we've already written, so we can safely
// copy those bits ahead even if concurrent code is still
// reading from that part of the buffer
System.arraycopy(buffer, 0, buffer, buffer.length - length, pos);
pos += buffer.length - length;
} else {
// this might leave some empty space between the header and
// the record data, but this case only occurs when the
// segment is >252kB in size and the maximum overhead is <<4kB,
// which is acceptable
length = buffer.length;
}
for (Map.Entry<RecordId, RecordType> entry : roots.entrySet()) {
int offset = entry.getKey().getOffset();
buffer[pos++] = (byte) entry.getValue().ordinal();
buffer[pos++] = (byte) (offset >> (8 + Segment.RECORD_ALIGN_BITS));
buffer[pos++] = (byte) (offset >> Segment.RECORD_ALIGN_BITS);
}
for (RecordId blobref : blobrefs) {
int offset = blobref.getOffset();
buffer[pos++] = (byte) (offset >> (8 + Segment.RECORD_ALIGN_BITS));
buffer[pos++] = (byte) (offset >> Segment.RECORD_ALIGN_BITS);
}
segmentId = segment.getSegmentId();
segmentBuffer = buffer;
segmentOffset = buffer.length - length;
segmentLength = length;